/**
 * 本文直接使用axios对象
 */
import axios from 'axios';
import QS from 'qs';
import util from '@/libs/util'
// import store from '../store/store'
import { Message } from 'element-ui';


// 创建一个错误，用于网络正常，但也想显示系统级错误。 主要是创建一个error对象
function errorCreate (msg) {
	const err = new Error(msg)
	errorLog(err)
	throw err // 抛出红色错误
}


// 记录和显示错误，当网络请求错误的时候，默认会生成error对象，可以直接带入参数使用这个方法
function errorLog (err) {
	if (process.env.NODE_ENV === 'development') { // 如果是开发环境，则打印到控制台
		util.log.danger('>>>>>> Error >>>>>>')  // 内部也是console.log
		console.log(err)
	}
	// 显示提示
	// Message({
	// 	message: err.message,
	// 	type: 'error',
	// 	duration: 2 * 1000
	// })
}


// axios 相关设置
axios.defaults.baseURL = process.env.VUE_APP_BASE_API // 强制设置请求前缀
axios.defaults.timeout = 5000; // 请求超时时间
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; // post请求头.不确定是否需要




// 请求拦截器
axios.interceptors.request.use(
	config => {
		// 关于发送2次请求的情况（跨域时才发生？）：https://www.jianshu.com/p/d1402693d642
		// config.headers.token = util.cookies.get("token")   // 模拟设定token
		// store.state.loading = true
		return config;
	},
	error => {
		return Promise.error(error);
	}
)




// 响应拦截器
axios.interceptors.response.use(
	response => {
		// store.state.loading = false
		if (response.status !== 200) {
			return Promise.reject(response);
		} else {
			return Promise.resolve(response.data)
		}
		// let dataAxios = response.data

		/*
		let { code } = dataAxios// 这个状态码是和后端约定的

		// 根据 code 进行处理
		if (code === undefined) {
			// 如果没有code 暂时还是原样返回
			return Promise.resolve(dataAxios)
		} else {
			// 有 code 代表这是一个后端接口 可以进行进一步的判断
			switch (code) {
				case 0:
					// [ 示例 ] code === 0 代表没有错误
					return Promise.resolve(dataAxios)
				case '7':
					// [ 示例 ] 其它和后台约定的 code
					errorCreate(`[ code: 7 ] ${dataAxios.msg}: ${response.config.url}`)
					break
				default:
					// 不是正确的 code
					errorCreate(`${dataAxios.msg}: ${response.config.url}`)
					break
			}
		}
		*/
	},

	// 服务器状态码不是200的情况
	error => {
		// 根据错误打印出来
		if (error && error.response) {
			switch (error.response.status) {
				case 400: error.message = '请求错误'; break
				case 401: error.message = '未授权，请登录'; break
				case 403: error.message = '拒绝访问'; break
				case 404: error.message = `请求地址出错: ${error.response.config.url}`; break
				case 408: error.message = '请求超时'; break
				case 500: error.message = '服务器内部错误'; break
				case 501: error.message = '服务未实现'; break
				case 502: error.message = '网关错误'; break
				case 503: error.message = '服务不可用'; break
				case 504: error.message = '网关超时'; break
				case 505: error.message = 'HTTP版本不受支持'; break
				default: break
			}
		}
		errorLog(error) // 先打印出来

		// 其它根据错误码的处理方式
		if (error && error.response && error.response.status) {
			switch (error.response.status) {
				// 401: 未登录
				// 未登录则跳转登录页面，并携带当前页面的路径
				// 在登录成功后返回当前页面，这一步需要在登录页操作。
				case 401:
					/*router.replace({
						path: '/login',
						query: { redirect: router.currentRoute.fullPath }
					});*/
					break;
				case 404:
                    // Message.error('请求目标不存在')
					
					break;
				// 其他错误，直接抛出错误提示
				default:
                    console.log(error.response.data.message)
			}
			return Promise.reject(error.response);
		}
	}
);
/**
 * get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */

export function get (url, params) {
	return new Promise((resolve, reject) => {
		axios.get(url, {
			params: params
		})
			.then(res => {
				resolve(res)
			})
			.catch(err => {
				reject(err)
			})
	});
}
/* >>>>>>>其实上面没有必要再封装一层prmise,axios本身返回的也是promise<<<<<<<<<<<<<<<<<<< */
export function get2 (url, params) {
	return axios.get(url, {
		params: params
	})
}
/**
 * post方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function post (url, params) {
	return new Promise((resolve, reject) => {
		axios.post(url, QS.stringify(params))
			.then(res => {
				resolve(res);
			})
			.catch(err => {
				reject(err)
			})
	});
}
